package com.lms.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Description: MD5字符串加密算法
 * @author: L-B-S
 * @Date: 2021/3/5 20:08
 * @modified_By:
 * @Version: 0.0$
 */
public class Md5Util {
    public static String stringMd5(String input) {
        try {
            // 1.拿到一个MD5转换器（如果想要SHA1参数换成”SHA1”）
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            // 2.输入的字符串转换为字节数组
            byte[] inputBytes = input.getBytes();
            // 3.inputByteArray是输入字符串转换得到的字节数组
            messageDigest.update(inputBytes);
            // 4.转换并返回结果，也是字节数组，包含16个元素
            byte[] resultByteArray = messageDigest.digest();
            // 5.字符数组转换成字符串返回
            return byteArrayToHex(resultByteArray);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 下面这个函数用于将字节数组换成成16进制的字符串
     *
     * @param byteArray 字节数组
     * @return 16进制字符串
     */
    private static String byteArrayToHex(byte[] byteArray) {
        // 1.首先初始化一个字符数组，存放每一个16进制字符
        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        // 2.new一个字符数组，来组成结果字符串的（解释一下：一个byte是八位二进制，也就是2位十六进制字符（2的8次方等于16的2次方）
        char[] resultCharArray = new char[byteArray.length * 2];
        // 3.遍历字节数组，通过位运算（位运算效率高），转换成字符串放到字符数组中去
        int index = 0;
        for (byte b : byteArray) {
            resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
            resultCharArray[index++] = hexDigits[b & 0xf];
        }
        // 4.字符数组组合成字符串返回
        return new String(resultCharArray);
    }
}
